import dotenv from 'dotenv'
import path from 'path'
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)

dotenv.config()

// 环境判断
const isDevelopment = process.env.NODE_ENV === 'development' || !process.env.NODE_ENV
const isProduction = process.env.NODE_ENV === 'production'

export default {
    port: process.env.PORT || 3000,
    // WebSocket配置
    websocket: {
        port: process.env.WS_PORT || 8299,
        useSSL: isProduction, // 生产环境使用SSL
        ssl: {
            key: path.join(__dirname, '../../ssl/private.key'),
            cert: path.join(__dirname, '../../ssl/certificate.crt'),
            ca: path.join(__dirname, '../../ssl/ca_bundle.crt')
        }
    },
    // 环境配置
    env: {
        isDevelopment,
        isProduction
    },
    mysql: {
      dialect: 'mysql',
      host: process.env.DB_HOST || 'localhost',
      username: process.env.DB_USER || 'root',
      password: process.env.DB_PASSWORD || '',
      database: process.env.DB_DATABASE || '',
      port: process.env.DB_PORT || 3306,
      pool: { // 连接池
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
      },
      logging: true,
      define: {
        freezeTableName: true, // 停止执行自动复数化
        underscored: true
      },
      timezone: '+08:00'
    },
    redis: {
      host: process.env.REDIS_HOST || 'localhost',
      password: process.env.REDIS_AUTH || null,
      db: process.env.REDIS_DB || 0,
      port: process.env.REDIS_PORT || 6379,

      // 集群模式配置
      cluster: {
        enable: process.env.REDIS_CLUSTER_ENABLE === 'true',
        nodes: process.env.REDIS_CLUSTER_NODES ? process.env.REDIS_CLUSTER_NODES.split(',').map(node => {
          const [host, port] = node.trim().split(':')
          return { host, port: parseInt(port) }
        }) : [],
        options: {
          password: process.env.REDIS_AUTH || null,
          // 集群重试配置
          retryDelayOnFailover: 100,
          maxRetriesPerRequest: 5, // 增加重试次数
          maxRedirections: 16, // 最大重定向次数
          // 集群发现配置
          enableReadyCheck: true,
          //enableOfflineQueue: false, // 禁用离线队列，避免数据不一致
          lazyConnect: true, // 延迟连接
          // 连接池配置
          scaleReads: 'slave', // 从从节点读取，提高性能
          redisOptions: {
            password: process.env.REDIS_AUTH || null,
            connectTimeout: 10000, // 连接超时
            commandTimeout: 5000,  // 命令超时
            retryDelayOnFailover: 100,
            maxRetriesPerRequest: 3,
            // 注意：Redis集群模式不支持多数据库，只能使用数据库0
          }
        }
      }
    },
    security: {
      secretKey: process.env.JWT_SECRET,
      // 过期时间 1小时
      expiresIn: 60 * 60
    }
}